package com.smdp.service;

import com.smdp.dto.Result;
import com.smdp.entity.VoucherOrder;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * 优惠券订单服务接口。
 * 包含获取普通券、尝试获取秒杀券、监听秒杀券消息队列的任务、监听线程池以及处理秒杀订单。秒杀券获取逻辑为：用户尝试获取秒杀券->
 * Lua脚本验证库存、验证秒杀资格、扣减Redis库存和发送消息到Redis消息队列->线程任务监听到消息->获取分布式锁->
 * 使用代理对象扣减数据库库存和创建秒杀订单。其中，使用Lua脚本保证验证尝试获取秒杀券时“扣减库存+发送消息到Redis消息队列”的原子性，
 * 使用Redis分布式锁保证不重复处理订单，使用代理对象+@Transactional注解保证处理订单时“扣减库存”和“创建订单”同成功同失败。
 *
 * @author 蔡方珩
 */
public interface IVoucherOrderService extends IService<VoucherOrder> {
    /**
     * 尝试获取秒杀券
     * @param voucherId 秒杀券id
     * @return 成功：orderId / 失败：失败原因
     */
    Result getSeckillVoucher(Long voucherId);
    /**
     * 创建秒杀订单。监听到Redis中订单消息后执行。
     * @param voucherOrder 订单信息
     */
    void createVoucherOrder(VoucherOrder voucherOrder);
    /**
     * 获取普通券
     * @param voucherId 普通券id
     * @return 成功：orderId / 失败：失败原因
     */
    Result getVoucher(Long voucherId);

}
